package cn.ljy.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 20240719最后修改
 * @author ljy
 * 整站的跨域配置
 * 对跨域进行处理，但是该跨域方式对spring mvc的拦截器无效（即在spring mvc拦截器中如果用outprint返回Json等类型信息时会出现跨域异常，当然如果不返回信息到客户端就不会出错）
 * 因此如果配置拦截器，还需要增加filter过滤器进行处理
 */
@Configuration//@Configuration 代表是一个 Java 配置文件 ， Spring会根据它来生成 IoC 容器去装配 Bean
public class CorsConfig implements WebMvcConfigurer {

    //解决跨域问题
    @Bean
    public CorsFilter corsFilter(){
        //跨域设置
        CorsConfiguration config=new CorsConfiguration();
        config.setAllowCredentials(true);//是否允许前端携带凭证(cookie)
        config.addAllowedOriginPattern("*");//允许任何域名访问
        config.addAllowedMethod("*");//允许任何方法（例如get、post、put、delete、**）访问
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource configSource=new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**",config);//配置生效的路径
        return new CorsFilter(configSource);
    }

    /**
     * 说明：addCorsMappings允许跨域，简单访问没问题，如果用户没登录被 filter 拦截的话，返回信息得不到，显示跨域失败，
     * 原因是 filter 直接拦截的执行在前，允许跨域执行在后，
     * 需要添加FilterRegistrationBean后解决问题，注意FilterRegistrationBean需要设置成在最前面执行。
     */
}
